/**
 * 二维码生成工具类
 * 用于生成优惠券线下核销二维码
 */

/**
 * 生成二维码数据URL
 * @param {String} text - 要生成二维码的文本内容
 * @param {Object} options - 配置选项
 * @returns {String} 二维码的base64数据URL
 */
export function generateQRCode(text, options = {}) {
  const {
    size = 200,           // 二维码尺寸
    margin = 10,          // 边距
    errorCorrectionLevel = 'M', // 错误纠正级别 L/M/Q/H
    foregroundColor = '#000000', // 前景色
    backgroundColor = '#FFFFFF'  // 背景色
  } = options

  try {
    // 使用Canvas生成二维码
    const canvas = uni.createCanvasContext('qrcode-canvas')
    
    // 这里使用简化的二维码生成逻辑
    // 在实际项目中，建议使用专业的二维码库如 qrcode.js
    const qrData = generateQRMatrix(text, errorCorrectionLevel)
    const moduleSize = Math.floor((size - margin * 2) / qrData.length)
    
    // 设置画布尺寸
    canvas.width = size
    canvas.height = size
    
    // 绘制背景
    canvas.fillStyle = backgroundColor
    canvas.fillRect(0, 0, size, size)
    
    // 绘制二维码模块
    canvas.fillStyle = foregroundColor
    for (let row = 0; row < qrData.length; row++) {
      for (let col = 0; col < qrData[row].length; col++) {
        if (qrData[row][col]) {
          const x = margin + col * moduleSize
          const y = margin + row * moduleSize
          canvas.fillRect(x, y, moduleSize, moduleSize)
        }
      }
    }
    
    // 转换为base64
    return canvas.toDataURL('image/png')
  } catch (error) {
    console.error('生成二维码失败:', error)
    return generateFallbackQRCode(text, size)
  }
}

/**
 * 生成优惠券核销二维码
 * @param {String} couponCode - 优惠券码
 * @param {Number} couponId - 优惠券ID
 * @param {Object} options - 配置选项
 * @returns {String} 二维码数据URL
 */
export function generateCouponQRCode(couponCode, couponId, options = {}) {
  // 生成格式：优惠券码_优惠券ID
  const qrText = `${couponCode}_${couponId}`
  
  const defaultOptions = {
    size: 300,
    margin: 20,
    errorCorrectionLevel: 'M',
    foregroundColor: '#333333',
    backgroundColor: '#FFFFFF'
  }
  
  const finalOptions = { ...defaultOptions, ...options }
  
  console.log('生成优惠券二维码:', qrText)
  return generateQRCode(qrText, finalOptions)
}

/**
 * 简化的二维码矩阵生成
 * 注意：这是一个简化版本，实际项目中建议使用专业库
 */
function generateQRMatrix(text, errorLevel = 'M') {
  // 这里使用一个简化的二维码生成算法
  // 实际项目中应该使用完整的QR Code算法
  
  const size = 21 // 最小的QR码尺寸
  const matrix = Array(size).fill().map(() => Array(size).fill(false))
  
  // 添加定位图案（左上、右上、左下角）
  addFinderPattern(matrix, 0, 0)
  addFinderPattern(matrix, size - 7, 0)
  addFinderPattern(matrix, 0, size - 7)
  
  // 添加时序图案
  addTimingPattern(matrix, size)
  
  // 简化的数据编码（实际应该根据QR码标准进行编码）
  addDataPattern(matrix, text, size)
  
  return matrix
}

/**
 * 添加定位图案
 */
function addFinderPattern(matrix, startRow, startCol) {
  const pattern = [
    [1,1,1,1,1,1,1],
    [1,0,0,0,0,0,1],
    [1,0,1,1,1,0,1],
    [1,0,1,1,1,0,1],
    [1,0,1,1,1,0,1],
    [1,0,0,0,0,0,1],
    [1,1,1,1,1,1,1]
  ]
  
  for (let i = 0; i < 7; i++) {
    for (let j = 0; j < 7; j++) {
      if (startRow + i < matrix.length && startCol + j < matrix[0].length) {
        matrix[startRow + i][startCol + j] = pattern[i][j] === 1
      }
    }
  }
}

/**
 * 添加时序图案
 */
function addTimingPattern(matrix, size) {
  for (let i = 8; i < size - 8; i++) {
    matrix[6][i] = i % 2 === 0
    matrix[i][6] = i % 2 === 0
  }
}

/**
 * 添加数据图案（简化版）
 */
function addDataPattern(matrix, text, size) {
  // 简化的数据填充，实际应该按照QR码标准进行
  const hash = simpleHash(text)
  let bitIndex = 0
  
  for (let i = 9; i < size - 1; i++) {
    for (let j = 9; j < size - 1; j++) {
      if (!matrix[i][j] && bitIndex < 32) {
        matrix[i][j] = (hash >> bitIndex) & 1
        bitIndex++
      }
    }
  }
}

/**
 * 简单哈希函数
 */
function simpleHash(str) {
  let hash = 0
  for (let i = 0; i < str.length; i++) {
    const char = str.charCodeAt(i)
    hash = ((hash << 5) - hash) + char
    hash = hash & hash // 转换为32位整数
  }
  return Math.abs(hash)
}

/**
 * 备用二维码生成（使用在线服务）
 */
function generateFallbackQRCode(text, size = 200) {
  // 使用在线二维码生成服务作为备用方案
  const encodedText = encodeURIComponent(text)
  return `https://api.qrserver.com/v1/create-qr-code/?size=${size}x${size}&data=${encodedText}`
}

/**
 * 验证二维码内容格式
 * @param {String} qrText - 二维码文本内容
 * @returns {Object} 验证结果
 */
export function validateCouponQRCode(qrText) {
  if (!qrText || typeof qrText !== 'string') {
    return { valid: false, error: '二维码内容为空' }
  }
  
  const parts = qrText.split('_')
  if (parts.length !== 2) {
    return { valid: false, error: '二维码格式错误' }
  }
  
  const [couponCode, couponId] = parts
  
  if (!couponCode || !couponId) {
    return { valid: false, error: '优惠券信息不完整' }
  }
  
  if (!/^\d+$/.test(couponId)) {
    return { valid: false, error: '优惠券ID格式错误' }
  }
  
  return {
    valid: true,
    couponCode,
    couponId: parseInt(couponId)
  }
}

/**
 * 获取二维码显示配置
 */
export function getQRCodeDisplayConfig() {
  return {
    size: 300,
    margin: 20,
    showText: true,
    textStyle: {
      fontSize: '14px',
      color: '#666666',
      marginTop: '10px'
    }
  }
}